import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth'
import { login, getUserInfo, getUserDetailById } from '@/api/user'
import { resetRouter } from '@/router'
const state = {
  // token: null // 设置 token 的共享状态
  token: getToken(), // 初始化登录状态时从缓存中读取token 并赋值到初始化状态
  userInfo: {} // 存储用户信息 创建一个空对象 不能是Null 否则无法调用用户信息里的属性
  // userDetail: {} // actions中做了合并 这里就不需要再单独给个人详细信息设置变量
}
const mutations = {
  // 修改token
  setToken(state, token) {
    state.token = token // 修改Vuex中的token值
    // Vuex数据变化要同步缓存到本地
    setToken(token) // 重新设置本地缓存中的token
  },
  // 修改用户信息
  setUserInfo(state, result) {
    state.userInfo = result
  },

  // 删除缓存中的token
  removeToken(state, token) {
    state.token = null // 删除Vuex中的token
    removeToken(token) // 删除本地缓存中的token
  },
  // 删除用户信息
  reomveUserInfo(state) {
    state.userInfo = {}
  }
}
const actions = {
  // 发起登录请求 获取token 并通过mutations修改state中的token
  async login(context, data) {
    // 调用请求的接口 login 获取token
    const result = await login(data) // 由于接口在响应拦截器中数据已经被做了解构处理 所以这里可以直接拿到拦截器中成功后返回的结果
    // console.log(result)
    // 首次登录获取到token时就要设置时间戳
    setTimeStamp(Date.now())
    // 存储token
    context.commit('setToken', result) // 这个result是拦截器处理后的数据
  },
  // 获取用户信息
  async getUserInfo(context) {
    const data = await getUserInfo() // 返回体已在响应拦截器中处理过 这里获取的数据就是data
    const result = await getUserDetailById(data.userId)
    // 合并用户信息和员工详细信息到 userInfo 中
    context.commit('setUserInfo', { ...data, ...result }) // 提交到mutations
    return data // return的结果 是为了后期做权限管理用
  },
  logout(context) {
    // 删除token
    context.commit('removeToken')
    // 删除用户信息
    context.commit('reomveUserInfo')
    // 重置路由
    resetRouter() // 把路由表中的路由重置为静态路由
    // 清空Vuex中的 permission 模块下的 state 数据
    // setRoutes 中的每次登录成功都会往state中新增路由 所以要给它添加一个空数组 把state.routes重置为静态路由
    // 但是如何在子模块user.js中调用子模块的permission.js的 mutations 呢
    // 如果不加命名空间 可以相互调用 但是加了命名空间后如何调用呢
    // 注意 还是用 context 来调用 但是要用到 {root:true} 表示调用父级的 mutations 或 actions
    // context.commit('setRoutes', []) // 如果不加root:true 此时会报错 因为当前模块的mutations中没有setRoutes这个方法
    // context.commit('setRoutes', [], { root: true }) // 加了root:true 后 代表调用父级的 setRoutes 但是父级中也没有这个方法
    // 所以正确调用方法如下 在子模块中调用父级模块下的permission子模块中的方法 并给payload 赋一个空数组
    context.commit('permission/setRoutes', [], { root: true })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
